home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
roman
/
roman2.bas
< prev
next >
Wrap
BASIC Source File
|
1994-06-01
|
13KB
|
389 lines
10 '
20 '====ローマ字仮名変換プログラム by 金子卓哉=====
30 ' (FOR FUJITSU FM TOWNS F-BASIC386 V2.1)
40 '
50 '内容
60 ' 指定されたファイルを読み込み、
70 ' 半角アルファベット部を仮名変換して、画面に表示する。
80 ' 半角アルファベットでない部分はそのまま表示する。
90 ' アルファベットの大文字小文字の区別はしない。
100 ' 入力ファイル名は、プログラム内で文字列 INPDEVICE$ に設定する。
110 '
120 '
130 ' 母音 : A I U E O
140 ' 子音 : K S T N H M Y R G Z D B P J (子音 + Y が許される)
150 ' 子音 : W F V CH SH TS L LY
160 '
170 'ローマ字表記ルール
180 ' 母音
190 ' 例 A I U E O -> あ い う え お
200 ' 子音1 + 母音, 子音2 + 母音
210 ' 例 KA GI FU SHE LA LYA -> か ぎ ふ しゃ ぁ ゃ
220 ' 子音1 + Y + 母音
230 ' 例 KYA SYI TYU BYE PYO -> きゃ しぃ ちゅ びぇ ぴょ
240 ' 促音「っ」 : 最初の子音を重ねる。
250 ' 例 ZAKKA KAPPU BATTO -> ざっか かっぷ ばっと
260 ' 撥音「ん」 : N もしくは N'
270 ' 例 BANTO SIN'YA SON'NA -> ばんと しんや そんな
280 ' 長音「ー」 : X (母音 もしくは N の直後)
290 ' 例 PICCHAX -> ぴっちゃー
300 '
310 '上記以外の場合
320 ' 規定外の文字は無視する
330 ' 例 CA QU -> A U
340 ' N 以外の単独の子音は無視する
350 ' 例 KHA STI -> HA TI
360 '
370 '注意
380 ' 次の場合 N は「ん」にならないので注意
390 ' N が重なる場合
400 ' N + Y の場合
410 ' 例 SONNA SINYA -> そっな しにゃ
420 ' L + 母音, L + Y + 母音 で、 小さい文字を表す
430 ' 例 LA LI LU LYA LYI LYI -> ぁ ぃ ぅ ゃ ぃ ゅ
440 '
450 '
460 '
470 '変数一覧
480 '
490 ' I, J 汎用変数
500 ' TRUE = -1
510 ' FALSE = 0 真偽判定用 定数
520 '
530 ' INPDEVICE$ 入力ファイル指定用 文字列変数
540 '
550 ' S$ 一行読み込み用 文字列変数
560 ' C$ 一文字読み込み用 文字列変数
570 '
580 ' CH キャラクタコード
590 '
600 ' N1 現在処理中の文字番号
610 ' N2 一つ前の文字番号
620 ' N3 二つ前の文字番号
630 '
640 ' N1 : A=0 から 「文字コードデータ」部の順に割り当てる
650 ' N2, N3 には、 N1 が順送りされていく。
660 '
670 ' ST 現在の状態を表す変数
680 '
690 ' ST = 0 変換直後。 N1 のみ考慮すればよい。
700 ' ST = 1 一文字保留中。 N2 と N1 を考慮する。
710 ' ST = 2 二文字保留中。 N3 と N2 と N1 を考慮する。
720 '
730 ' ATTR(Nn) 文字属性用 配列 Nn:文字番号
740 '
750 ' ATTR(Nn) = 0 母音
760 ' 1 子音
770 ' 2 その他
780 '
790 ' CODE(Nn) 文字コード用 配列 Nn:文字番号
800 '
810 ' 規定の文字コードを表す。
820 '
830 ' KANA$(Cs,Cb) 変換表用 文字列配列
840 ' Cs:子音の文字コード, Cb:母音の文字コード
850 ' 子音と母音の文字コードに対応する、 仮名文字列
860 '
870 '
880 '----データ部----
890 '
900 *ZOKUSEI' 文字属性データ(0:母音 1:子音 2:特例 3:その他)
910 ' A B C D E F G H I J K L M N O P ' 文字番号 0~15
920 DATA 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 ' 文字属性
930 ' Q R S T U V W X Y Z ' CH SH TS LY 他 ' 文字番号16~31
940 DATA 2, 1, 1, 1, 0, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 3 ' 文字属性
950 '
960 *MOJICODE' 文字コードデータ
970 ' A B C D E F G H I J K L M N O P ' 文字番号 0~15
980 DATA 0,12,23,11, 3,16, 9, 5, 1,14, 1,21, 6, 4, 4,13 ' 文字コード
990 ' Q R S T U V W X Y Z ' CH SH TS LY 他 ' 文字番号16~31
1000 DATA 24, 8, 2, 3, 2,17,15,25, 7,10,26,18,19,20,22,27 ' 文字コード
1010 '
1020 *HENKANHYOU' 変換表データ(数字は文字コード)
1030 ' A I U E O
1040 ' 0 1 2 3 4
1050 DATA あ ,い ,う ,え ,お ' 0 A
1060 DATA か ,き ,く ,け ,こ ' 1 K ここから
1070 DATA さ ,し ,す ,せ ,そ ' 2 S
1080 DATA た ,ち ,つ ,て ,と ' 3 T
1090 DATA な ,に ,ぬ ,ね ,の ' 4 N
1100 DATA は ,ひ ,ふ ,へ ,ほ ' 5 H
1110 DATA ま ,み ,む ,め ,も ' 6 M
1120 DATA や ,い ,ゆ ,いぇ,よ ' 7 Y
1130 DATA ら ,り ,る ,れ ,ろ ' 8 R
1140 DATA が ,ぎ ,ぐ ,げ ,ご ' 9 G
1150 DATA ざ ,じ ,ず ,ぜ ,ぞ '10 Z
1160 DATA だ ,ぢ ,づ ,で ,ど '11 D
1170 DATA ば ,び ,ぶ ,べ ,ぼ '12 B
1180 DATA ぱ ,ぴ ,ぷ ,ぺ ,ぽ '13 P
1190 DATA じゃ,じ ,じゅ,じぇ,じょ '14 J ここまでが子音1
1200 DATA わ ,うぃ,う ,うぇ,を '15 W
1210 DATA ふぁ,ふぃ,ふ ,ふぇ,ふぉ '16 F
1220 DATA ぁ,ぃ, ,ぇ,ぉ '17 V
1230 DATA ちゃ,ち ,ちゅ,ちぇ,ちょ '18 CH
1240 DATA しゃ,し ,しゅ,しぇ,しょ '19 SH
1250 DATA さ ,し ,つ ,せ ,そ '20 TS
1260 DATA ぁ, ぃ, ぅ, ぇ, ぉ '21 L
1270 DATA ゃ, ぃ, ゅ, ぇ, ょ '22 LY
1280 DATA あ ,い ,う ,え ,お '23 C
1290 DATA あ ,い ,う ,え ,お '24 Q
1300 ' 以後 25 X 26 ' 27 その他
1310 '
1320 '----初期設定----
1330 '
1340 SCREEN@ 0 : CLS ' 画面設定
1350 DEFINT A-Z
1360 ON KEY(1) GOSUB *END : ON ERROR GOTO *ERR ' 割り込み処理設定
1370 '
1380 TRUE = -1 : FALSE = 0 ' 真偽判定用定数
1390 '
1400 '配列宣言
1410 ATTRMAX = 31 : CODEMAX = 31 : BOINMAX = 4 : SIINMAX = 24
1420 DIM ATTR(ATTRMAX), CODE(CODEMAX), KANA$(SIINMAX, BOINMAX)
1430 '
1440 '各配列にデータを読み込む
1450 RESTORE *ZOKUSEI
1460 FOR I=0 TO ATTRMAX
1470 READ ATTR(I) '文字属性
1480 NEXT
1490 RESTORE *MOJICODE
1500 FOR I=0 TO CODEMAX
1510 READ CODE(I) '文字コード
1520 NEXT
1530 RESTORE *HENKANHYOU
1540 FOR J=0 TO SIINMAX
1550 FOR I=0 TO BOINMAX
1560 READ KANA$(J, I) '変換表
1570 NEXT
1580 NEXT
1590 '
1600 '----メインプログラム----
1610 '
1620 *START
1630 '
1640 MOUSE 0 ' マウス機能初期化
1650 KEY(1) ON ' 割り込み開始
1660 '
1670 GOSUB *INPUTFILE ' ファイル名入力ルーチンへ
1680 '
1690 OPEN "I", #1, INPDEVICE$ ' ファイルオープン(既存, 入力モード )
1700 '
1710 GOSUB *CAUTION ' 注意表示
1720 '
1730 '以下, ファイルの終わりまで繰り返す
1740 WHILE (EOF(1) = FALSE) AND (INKEY$ = "")
1750 '
1760 LINE INPUT #1, S$ ' 一行読み込み
1770 ST=0
1780 '
1790 '空行でなければ以下実行
1800 IF (KLEN(S$,0) > 0) THEN
1810 '
1820 '以下, 一文字目から一行の終わりまで繰り返す
1830 FOR I=1 TO KLEN(S$,0)
1840 '
1850 C$ = KMID$(S$,I,1) ' I文字目読み込み
1860 CH = ASC(C$) ' キャラクタコードを求める
1870 '
1880 GOSUB *CH_TO_N1 ' 規定の文字番号を求める
1890 '
1900 '状態によって分岐
1910 ON ST+1 GOSUB *HENKAN1, *HENKAN2, *HENKAN3
1920 '
1930 N3 = N2 : N2 = N1 ' 次の文字へ
1940 '
1950 'マウスが押されていたらリリース待ち
1960 WHILE (MOUSE(2,0) = TRUE) : WEND
1970 '
1980 NEXT
1990 '
2000 ENDIF
2010 '
2020 PRINT ' 一行終わったので改行
2030 WEND
2040 '
2050 CLOSE ' ファイルクローズして初めに戻る
2060 COLOR 5 : PRINT : PRINT "変換終了です。"
2070 GOTO *START
2080 '
2090 '
2100 '---以下、 サブルーチン---
2110 '
2120 '一文字目
2130 *HENKAN1
2140 IF (ATTR(N1) = 0) THEN ' 母音の場合
2150 PRINT KANA$(0, CODE(N1)); ' そのまま変換して変換終了
2160 ST = 0
2170 ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
2180 ST = 1 ' 通常は一文字保留だが
2190 IF (I = KLEN(S$,0)) AND (N1 = 13) THEN
2200 PRINT "ん"; ' 文末で「N」の場合のみ「ん」を出力して変換終了
2210 ST = 0
2220 ENDIF
2230 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
2240 IF (N1 = 23) THEN ' 「X」の場合は「ー」を出力し
2250 PRINT "ー";
2260 ELSE IF (N1 = 26) THEN ' 「'」の場合はそのまま出力し
2270 PRINT C$;
2280 ENDIF ' 「Q」の場合は何もしないで
2290 ST = 0 ' 変換終了
2300 ELSE ' アルファベットでない文字の場合
2310 PRINT C$; ' そのまま出力して変換終了
2320 ST = 0
2330 ENDIF
2340 RETURN
2350 '
2360 '二文字目(子音 + 二文字目)
2370 *HENKAN2
2380 IF (ATTR(N1) = 0) THEN ' 母音の場合
2390 PRINT KANA$(CODE(N2), CODE(N1)); ' 子音と併せて変換して出力
2400 ST = 0
2410 ELSE IF (ATTR(N1) = 1) THEN ' 二文字目も子音の場合
2420 IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
2430 PRINT "っ"; ' 「っ」を出力して一文字保留
2440 ST = 1
2450 ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
2460 N1 = 27 ' 子音を「CH」にして一文字保留
2470 ST = 1
2480 ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
2490 N1 = 28 ' 子音を「SH」にして一文字保留
2500 ST = 1
2510 ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
2520 N1 = 29 ' 子音を「TS」にして一文字保留
2530 ST = 1
2540 ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
2550 N1 = 30 ' 子音を「LY」にして一文字保留
2560 ST = 1
2570 ELSE ' それ以外の「子音 + 子音」の場合は
2580 ST = 2 ' 通常は二文字保留だが
2590 IF (I = KLEN(S$,0)) AND (CODE(N2) = 4) THEN
2600 PRINT "ん"; ' 「N+子音」が文末の場合のみ「ん」を出力して変換終了
2610 ST = 0
2620 ENDIF
2630 ENDIF
2640 IF (I = KLEN(S$,0)) AND (CODE(N1) = 4) THEN
2650 PRINT "ん"; ' 「N」が文末の場合には「ん」を出力して変換終了
2660 ST = 0
2670 ENDIF
2680 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
2690 IF (N2 = 13) THEN ' 一文字目が「N」なら
2700 PRINT "ん"; ' 「ん」を出力し
2710 IF (N1 = 23) THEN ' 二文字目が「X」なら
2720 PRINT "ー"; ' 「ー」を出力して
2730 ENDIF
2740 ENDIF
2750 ST = 0 ' 変換終了
2760 ELSE ' アルファベットでない場合
2770 IF (N2 = 13) THEN ' 一文字目が「N」なら
2780 PRINT "ん"; ' 「ん」を出力し
2790 ENDIF
2800 PRINT C$; ' そのまま出力して変換終了
2810 ST = 0
2820 ENDIF
2830 RETURN
2840 '
2850 '三文字目(子音 + 子音 + 三文字目)
2860 *HENKAN3
2870 IF (ATTR(N1) = 0) THEN ' 母音の場合
2880 IF ((1 <= CODE(N3)) AND (CODE(N3) <= 14)) AND (N2 = 24) THEN
2890 ' 「子音1 + Y + 母音」の場合 例 KYA -> KI + LYA -> きゃ
2900 PRINT KANA$(CODE(N3), 1) + KANA$(22, CODE(N1));
2910 ELSE ' それ以外の場合は一文字目は無視するが
2920 IF (N3 = 13) THEN ' 一文字目が「N」なら
2930 PRINT "ん"; ' 「ん」を出力し
2940 ENDIF
2950 PRINT KANA$(CODE(N2), CODE(N1)); ' 「子音 + 母音」を出力して
2960 ENDIF
2970 '変換終了
2980 ST = 0
2990 ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
3000 ST = 2 ' 通常は最初の子音は切り捨てて二文字保留
3010 IF (N3 = 13) THEN '一文字目が「N」の場合のみ
3020 PRINT "ん"; ' 「ん」を出力
3030 ENDIF
3040 IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
3050 PRINT "っ"; ' 「っ」を出力して一文字保留
3060 ST = 1
3070 ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
3080 N1 = 18 ' 子音「CH」一文字のみ保留
3090 ST = 1
3100 ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
3110 N1 = 19 ' 子音「SH」一文字のみ保留
3120 ST = 1
3130 ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
3140 N1 = 20 ' 子音「TS」一文字のみ保留
3150 ST = 1
3160 ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
3170 N1 = 21 ' 子音「LY」一文字のみ保留
3180 ST = 1
3190 ENDIF
3200 IF (I = KLEN(S$,0)) AND (N1 = 13) THEN ' 「N」が文末の場合は
3210 PRINT "ん"; ' 「ん」を出力して変換終了
3220 ST = 0
3230 ENDIF
3240 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
3250 IF (N3 = 13) THEN ' 一文字目が「N」の場合「ん」を出力
3260 PRINT "ん";
3270 ENDIF
3280 IF (N2 = 13) THEN ' 二文字目が「N」の場合「ん」を出力
3290 PRINT "ん";
3300 ENDIF
3310 ST = 0 ' 変換終了
3320 ELSE ' アルファベットでない場合
3330 IF (N3 = 13) THEN ' 一文字目が「N」の場合「ん」を出力
3340 PRINT "ん";
3350 ENDIF
3360 IF (N2 = 13) THEN ' 二文字目が「N」の場合「ん」を出力
3370 PRINT "ん";
3380 ENDIF
3390 PRINT C$; ' そのまま出力して変換終了
3400 ST = 0
3410 ENDIF
3420 RETURN
3430 '
3440 'キャラクタコードから、 規定の文字番号を求める
3450 *CH_TO_N1
3460 IF (ASC("A") <= CH) AND (CH <= ASC("Z")) THEN ' 大文字
3470 N1 = CH - ASC("A")
3480 ELSE IF (ASC("a") <= CH) AND (CH <= ASC("z")) THEN ' 小文字
3490 N1 = CH - ASC("a")
3500 ELSE IF (CH = ASC("'")) THEN ' 「'」
3510 N1 = 26
3520 ELSE ' アルファベットでない文字
3530 N1 = 31
3540 ENDIF
3550 RETURN
3560 '
3570 '入力ファイル名指定
3580 *INPUTFILE
3590 PRINT : COLOR 4
3600 PRINT "ローマ字仮名変換プログラム(真面目版) by たくりん"
3610 COLOR 7 : PRINT "マウス左クリック待ちです";
3620 PRINT "([CTRL]+[ESC]→サイドワーク,[PF 1]→終了)。"
3630 PRINT "準備が出来たら左クリックして下さい(カーソルが現れます)。"
3640 PRINT "INPUT FILE ? >";
3650 WHILE (MOUSE(2,0) = FALSE) : WEND
3660 LINE INPUT INPDEVICE$
3670 RETURN
3680 '
3690 '注意表示
3700 *CAUTION
3710 COLOR 5 : PRINT
3720 PRINT "マウスの左ボタンを押している間表示が止まります。";
3730 PRINT "また、何かキーを押すと中断し、最初に戻ります。"
3740 PRINT : COLOR 7
3750 RETURN
3760 '
3770 'エラー時
3780 *ERR
3790 CLOSE : COLOR 2 : PRINT
3800 PRINT "何かエラーが起きました。 エラー番号";ERR;"エラー行";ERL
3810 RESUME *START
3820 '
3830 '終了
3840 *END
3850 CLOSE : MOUSE 5
3860 COLOR 5 : PRINT : PRINT : PRINT "終了します。" : COLOR 7
3870 END
3880 '